<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Hash 对象的扩容流程</title>
    <link href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <link href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
            min-height: 100vh;
        }
        .hero-gradient {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        }
        .card-hover {
            transition: all 0.3s ease;
        }
        .card-hover:hover {
            transform: translateY(-5px);
            box-shadow: 0 20px 40px rgba(0,0,0,0.1);
        }
        .number-circle {
            width: 40px;
            height: 40px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            font-weight: bold;
            flex-shrink: 0;
        }
        .content-card {
            background: rgba(255, 255, 255, 0.95);
            backdrop-filter: blur(10px);
        }
        .highlight-text {
            background: linear-gradient(to right, #667eea, #764ba2);
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            background-clip: text;
        }
        .code-style {
            background: #f3f4f6;
            padding: 2px 8px;
            border-radius: 4px;
            font-family: 'Courier New', monospace;
            color: #764ba2;
        }
        .mermaid {
            display: flex;
            justify-content: center;
            margin: 2rem 0;
        }
        .section-divider {
            height: 2px;
            background: linear-gradient(to right, transparent, #e5e7eb, transparent);
            margin: 3rem 0;
        }
    </style>
</head>
<body>
    <!-- Hero Section -->
    <div class="hero-gradient text-white py-20 px-6">
        <div class="max-w-6xl mx-auto text-center">
            <h1 class="text-5xl md:text-6xl font-bold mb-6 tracking-tight">
                <i class="fas fa-expand-arrows-alt mr-4"></i>
                Hash 对象的扩容流程
            </h1>
            <p class="text-xl md:text-2xl opacity-90 max-w-3xl mx-auto leading-relaxed">
                深入理解哈希表扩容机制，掌握高性能数据结构的核心原理
            </p>
        </div>
    </div>

    <!-- Main Content -->
    <div class="max-w-6xl mx-auto px-6 py-12">
        <!-- Introduction Card -->
        <div class="content-card rounded-2xl shadow-xl p-8 mb-12 card-hover">
            <div class="flex items-start">
                <i class="fas fa-info-circle text-3xl text-purple-600 mr-4 mt-1"></i>
                <div>
                    <h2 class="text-2xl font-bold mb-4 highlight-text">核心概念</h2>
                    <p class="text-lg text-gray-700 leading-relaxed">
                        Hash 对象的扩容流程是一个重要的过程，用于在哈希表中处理数据量的增长，确保哈希表的性能保持在合理范围内。扩容的主要目的是减少冲突，提高查找、插入和删除操作的效率。
                    </p>
                </div>
            </div>
        </div>

        <!-- Process Visualization -->
        <div class="content-card rounded-2xl shadow-xl p-8 mb-12">
            <h2 class="text-3xl font-bold mb-8 text-center highlight-text">扩容流程可视化</h2>
            <div class="mermaid">
                graph TD
                    A[开始] --> B{检查负载因子}
                    B -->|超过阈值| C[计算新容量]
                    B -->|未超过| H[继续正常操作]
                    C --> D[创建新哈希表]
                    D --> E[重新计算哈希值]
                    E --> F[迁移数据到新表]
                    F --> G[替换旧表]
                    G --> H
                    
                    style A fill:#667eea,stroke:#fff,stroke-width:2px,color:#fff
                    style G fill:#764ba2,stroke:#fff,stroke-width:2px,color:#fff
                    style B fill:#f59e0b,stroke:#fff,stroke-width:2px,color:#fff
            </div>
        </div>

        <!-- Steps Grid -->
        <div class="grid md:grid-cols-2 gap-8 mb-12">
            <!-- Step 1 -->
            <div class="content-card rounded-xl shadow-lg p-6 card-hover">
                <div class="flex items-start mb-4">
                    <div class="number-circle">1</div>
                    <h3 class="text-xl font-bold ml-4 mt-2">触发扩容</h3>
                </div>
                <ul class="space-y-3 ml-14">
                    <li class="flex items-start">
                        <i class="fas fa-check-circle text-purple-600 mr-2 mt-1"></i>
                        <div>
                            <strong>负载因子（Load Factor）</strong>超过预设阈值。例如，在很多哈希表实现中，当负载因子超过 0.75 时，会触发扩容。
                        </div>
                    </li>
                    <li class="flex items-start">
                        <i class="fas fa-check-circle text-purple-600 mr-2 mt-1"></i>
                        <div>
                            <strong>手动触发</strong>：在某些情况下，开发者可以通过配置手动触发扩容。
                        </div>
                    </li>
                </ul>
            </div>

            <!-- Step 2 -->
            <div class="content-card rounded-xl shadow-lg p-6 card-hover">
                <div class="flex items-start mb-4">
                    <div class="number-circle">2</div>
                    <h3 class="text-xl font-bold ml-4 mt-2">计算新容量</h3>
                </div>
                <ul class="space-y-3 ml-14">
                    <li class="flex items-start">
                        <i class="fas fa-check-circle text-purple-600 mr-2 mt-1"></i>
                        <div>
                            <strong>倍增</strong>：通常将哈希表的容量翻倍。例如，如果当前容量为 <span class="code-style">N</span>，扩容后容量变为 <span class="code-style">2N</span>。
                        </div>
                    </li>
                    <li class="flex items-start">
                        <i class="fas fa-check-circle text-purple-600 mr-2 mt-1"></i>
                        <div>
                            <strong>下一个素数</strong>：有些实现使用下一个素数作为新容量，以减少冲突的可能性。
                        </div>
                    </li>
                </ul>
            </div>

            <!-- Step 3 -->
            <div class="content-card rounded-xl shadow-lg p-6 card-hover">
                <div class="flex items-start mb-4">
                    <div class="number-circle">3</div>
                    <h3 class="text-xl font-bold ml-4 mt-2">创建新的哈希表</h3>
                </div>
                <ul class="space-y-3 ml-14">
                    <li class="flex items-start">
                        <i class="fas fa-check-circle text-purple-600 mr-2 mt-1"></i>
                        <div>
                            <strong>新表的桶数组</strong>：初始化大小为新容量的桶数组。
                        </div>
                    </li>
                    <li class="flex items-start">
                        <i class="fas fa-check-circle text-purple-600 mr-2 mt-1"></i>
                        <div>
                            <strong>空桶</strong>：新表的桶数组初始化为空，每个桶可以是链表、数组或其他数据结构，具体取决于实现。
                        </div>
                    </li>
                </ul>
            </div>

            <!-- Step 4 -->
            <div class="content-card rounded-xl shadow-lg p-6 card-hover">
                <div class="flex items-start mb-4">
                    <div class="number-circle">4</div>
                    <h3 class="text-xl font-bold ml-4 mt-2">重新计算哈希值</h3>
                </div>
                <ul class="space-y-3 ml-14">
                    <li class="flex items-start">
                        <i class="fas fa-check-circle text-purple-600 mr-2 mt-1"></i>
                        <div>
                            <strong>重新哈希</strong>：使用新的容量计算新的哈希值，以决定新的桶位置。
                        </div>
                    </li>
                    <li class="flex items-start">
                        <i class="fas fa-check-circle text-purple-600 mr-2 mt-1"></i>
                        <div>
                            <strong>重新插入</strong>：遍历旧哈希表中的每个桶，将桶中的所有键值对插入新哈希表中。
                        </div>
                    </li>
                </ul>
            </div>

            <!-- Step 5 -->
            <div class="content-card rounded-xl shadow-lg p-6 card-hover">
                <div class="flex items-start mb-4">
                    <div class="number-circle">5</div>
                    <h3 class="text-xl font-bold ml-4 mt-2">替换旧哈希表</h3>
                </div>
                <ul class="space-y-3 ml-14">
                    <li class="flex items-start">
                        <i class="fas fa-check-circle text-purple-600 mr-2 mt-1"></i>
                        <div>
                            <strong>原子替换</strong>：在多线程环境中，通常会使用原子操作确保哈希表替换的线程安全性。
                        </div>
                    </li>
                    <li class="flex items-start">
                        <i class="fas fa-check-circle text-purple-600 mr-2 mt-1"></i>
                        <div>
                            <strong>释放内存</strong>：在替换后，旧哈希表的内存会被释放，以便垃圾回收器回收。
                        </div>
                    </li>
                </ul>
            </div>

            <!-- Performance Considerations -->
            <div class="content-card rounded-xl shadow-lg p-6 card-hover">
                <div class="flex items-start mb-4">
                    <div class="number-circle">6</div>
                    <h3 class="text-xl font-bold ml-4 mt-2">扩容的性能考虑</h3>
                </div>
                <p class="text-gray-700 mb-3 ml-14">扩容是一个成本较高的操作，涉及到重新哈希所有元素。为了优化扩容的性能，可以考虑以下几点：</p>
                <ul class="space-y-3 ml-14">
                    <li class="flex items-start">
                        <i class="fas fa-check-circle text-purple-600 mr-2 mt-1"></i>
                        <div>
                            <strong>懒惰扩容</strong>：在负载因子达到阈值时，逐步扩容，避免一次性扩容带来的性能瓶颈。
                        </div>
                    </li>
                    <li class="flex items-start">
                        <i class="fas fa-check-circle text-purple-600 mr-2 mt-1"></i>
                        <div>
                            <strong>异步扩容</strong>：在一些实现中，扩容过程可能是异步进行的，以减少对正常操作的影响。
                        </div>
                    </li>
                </ul>
            </div>
        </div>

        <!-- Complexity and Performance -->
        <div class="grid md:grid-cols-2 gap-8 mb-12">
            <div class="content-card rounded-xl shadow-lg p-8 card-hover">
                <div class="flex items-center mb-4">
                    <i class="fas fa-clock text-3xl text-purple-600 mr-4"></i>
                    <h3 class="text-2xl font-bold">扩容的复杂度</h3>
                </div>
                <p class="text-lg text-gray-700 leading-relaxed">
                    扩容过程的时间复杂度通常是 <span class="code-style">O(n)</span>，其中 <span class="code-style">n</span> 是旧哈希表中的元素数量。这是因为每个元素都需要重新计算哈希值并插入新哈希表。
                </p>
            </div>

            <div class="content-card rounded-xl shadow-lg p-8 card-hover">
                <div class="flex items-center mb-4">
                    <i class="fas fa-chart-line text-3xl text-purple-600 mr-4"></i>
                    <h3 class="text-2xl font-bold">扩容后的